SpringEvent 事件驱动介绍
Spring中的事件驱动模型也叫作发布订阅模式,是观察者模式的一个典型的应用
Spring事件驱动模型中存在三个角色: 事件原型、事件发布者、事件监听者.
Spring事件原型
Spring事件定义通过ApplicationEvent,该类继承自Jdk的EventObject; JDK要求所有事件将继承它,并通过source得到事件源, 比如我们的AWT事件体系也是继承自它;
ApplicationEvent规范定义如下:
1 | public abstract class ApplicationEvent extends EventObject { |
Spring事件发布者
Spring事件发布规范定义在ApplicationEventPublisher中,主要用于事件发布者发布中事件;
ApplicationEventPublisher规范定义如下:
1 | public interface ApplicationEventPublisher { |
ApplicationContext接口就集成了ApplicationEventPublisher,如图:
对于ApplicationContext, Spring提供了默认的实现, 在抽象类AbstractApplicationContext中, 常见的AnnotationConfigWebApplicationContext
、ClassPathXmlApplicationContext
、FileSystemXmlApplicationContext
都有继承AbstractApplicationContext的事件行为:
AbstractApplicationContext类中实现代码如下:
1 | /** |
在这个方法中,我们看到了一getApplicationEventMulticaster();ApplicationEventMulticaster.属于事件广播器,它的作用是把ApplicationContext发布的Event广播给所有的监听器.
Spring事件监听者
Spring中ApplicationListener是事件监控者规范的定义, 定义内容如下:
1 | public interface ApplicationListener<E extends ApplicationEvent> extends EventListener { |
ApplicationListener继承自jdk的EventListener,所有的监听器都要实现这个接口,这个接口只有一个onApplicationEvent()方法,该方法接受一个ApplicationEvent或其子类对象作为参数,在方法体中,可以通过不同对Event类的判断来进行相应的处理.当事件触发时所有的监听器都会收到消息,如果你需要对监听器的接收顺序有要求,可以实现该接口的一个子接口SmartApplicationListener,通过这个接口可以指定监听器接收事件的顺序.
SmartApplicationListener的接口集成关系如下:
SpringEvent 事件应用示例
事件定义
1 | public class PlanAllocatePubEvent extends ApplicationEvent { |
事件发布
1 |
|
事件监听(无序)
同步事件处理
1 |
|
异步事件处理
1 |
|
事件监听(有序)
示例代码: 事件监听逻辑1
1 |
|
示例代码: 事件监听逻辑2
1 |
|
测试事件
1 |
|
异步事件执行结果
1 | INFO:2017-09-11 20:14:08.799[publishEvent] [事件发布] 数据创建, 数据编号:1 |
同步事件执行结果
1 | INFO:2017-09-11 20:17:07.470[publishEvent] [事件发布] 数据创建, 数据编号:1 |
有序事件执行结果
1 | INFO:2017-09-11 20:33:12.139[publishEvent] [事件发布] 数据创建, 编号:1 |
注解事件监听
Spring4.2开始提供了@EventListener注解,使得监听器不再需要实现ApplicationListener接口,只需要在监听方法上加上该注解即可,方法不一定叫onApplicationEvent,但有且只能有一个参数,指定监听的事件类型.
上面示例中的有序事件监听逻辑可以使用注解方式实现:
1 |
|
注解事件监听执行结果
1 | INFO:2017-09-11 20:57:00.167[publishEvent] [事件发布] 数据创建, 编号:1 |